
package kr.makjang.lib.manager;

import java.util.HashMap;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;

/**
 * @since 2011.12.13
 * @author FateInDestiny
 * @package kr.makjang.lib.manager
 * @content Dialog를 생성시에 편의로 만든 class
 */
public class MakDialogManager {

    public static final int DIALOGMANAGER_LISTENER_POSITIVE = 0x01;

    public static final int DIALOGMANAGER_LISTENER_NEUTRAL = 0x02;

    public static final int DIALOGMANAGER_LISTENER_NEGATIVE = 0x03;

    private static HashMap<String, AlertDialogCache> mCashMap = new HashMap<String, AlertDialogCache>();

    /**
     * AlertDialog 표시 데이터를 Key와 매칭하여 저장하고 어디서든 사용할수 있게 처리 하기 위한 클래스
     * 
     * @since 2011. 12. 14.
     * @author FateInDestiny
     */
    public static class AlertDialogCache {
        private String mId;

        private int mIcon = -1;

        private String mTitle = null;

        private String mMessage = null;

        private HashMap<Integer, MakDialogManager.DialogButtonListener> mListener = new HashMap<Integer, MakDialogManager.DialogButtonListener>();

        /**
         * @param id 저장할 Dialog Data Key
         * @param icon Dialog Icon
         * @param title Dialog Title
         * @param message Dialog Message
         * @param listener Dialog OnClickListener Map
         */
        public AlertDialogCache(String id, int icon, String title, String message,
                HashMap<Integer, MakDialogManager.DialogButtonListener> listener) {
            mId = id;
            mIcon = icon;
            mTitle = title;
            mMessage = message;
            mListener = listener;
            mCashMap.put(mId, this);
        }

        /**
         * 저장되어 있는 자신의 데이터를 통해 AlertDialog를 표시를 위한 Dialog 생성
         * 
         * @param context
         * @return
         */
        private AlertDialog getAlertDialog(Context context) {
            AlertDialog.Builder builder = new AlertDialog.Builder(context);

            if (mIcon != -1)
                builder.setIcon(mIcon);

            if (mTitle != null)
                builder.setTitle(mTitle);

            if (mMessage != null)
                builder.setMessage(mMessage);

            if (mListener.containsKey(MakDialogManager.DIALOGMANAGER_LISTENER_POSITIVE)) {
                builder.setPositiveButton(
                        mListener.get(MakDialogManager.DIALOGMANAGER_LISTENER_POSITIVE).getName(),
                        mListener.get(MakDialogManager.DIALOGMANAGER_LISTENER_POSITIVE)
                                .getOnClickListener());
            }

            if (mListener.containsKey(MakDialogManager.DIALOGMANAGER_LISTENER_NEUTRAL)) {
                builder.setNeutralButton(
                        mListener.get(MakDialogManager.DIALOGMANAGER_LISTENER_NEUTRAL).getName(),
                        mListener.get(MakDialogManager.DIALOGMANAGER_LISTENER_NEUTRAL)
                                .getOnClickListener());
            }

            if (mListener.containsKey(MakDialogManager.DIALOGMANAGER_LISTENER_NEGATIVE)) {
                builder.setNegativeButton(
                        mListener.get(MakDialogManager.DIALOGMANAGER_LISTENER_NEGATIVE).getName(),
                        mListener.get(MakDialogManager.DIALOGMANAGER_LISTENER_NEGATIVE)
                                .getOnClickListener());
            }

            return builder.create();
        }
    } // end of class DialogCash

    /**
     * Cashe Map 데이터데 저장되어 있는 ID 값에 따라 다이얼로그를 생성하여 반환
     * 
     * @param context
     * @param id
     * @return
     */
    public static AlertDialog getAlertDialog(Context context, String id) {
        return mCashMap.get(id).getAlertDialog(context);
    }

    /**
     * 버튼의 매칭을 위해 버튼 이름과 Listener를 매칭하여 저장하기 위한 클래스
     * 
     * @since 2011. 12. 14.
     */
    public static class DialogButtonListener {
        private DialogInterface.OnClickListener mOnClickListener;

        private String mName;

        public DialogButtonListener(String name, DialogInterface.OnClickListener onClickListener) {
            mName = name;
            mOnClickListener = onClickListener;
        }

        public DialogInterface.OnClickListener getOnClickListener() {
            return mOnClickListener;
        }

        public String getName() {
            return mName;
        }
    } // end of class OnClickListener
} // end of class DialogManager
